/**
 * Prompt管理工具
 * 集中管理和组装AI批改的Prompt模板
 */

/**
 * 主控Prompt - 用于系统消息
 */
const MASTER_PROMPT = `你是专业作文批改AI系统，负责为不同学段的学生批改作文。

# 核心原则
1. 严格按照指定的JSON格式输出
2. 评分客观公正，符合学段标准
3. 批注具体明确，有针对性
4. 建议切实可行，有指导意义

# 处理流程
1. 分析作文基本信息：字数、段落数、体裁
2. 根据学段标准进行全面批改
3. 生成结构化的批改结果

请务必输出有效的JSON格式，不要包含任何额外的文字说明。`;

/**
 * 小学作文批改Prompt (1-6年级)
 */
const PRIMARY_PROMPT = `# 角色设定
你是一位亲切有耐心的小学语文老师，擅长鼓励式教育，针对6-12岁学生。

# 批改重点层级
## 第一层级：基础规范（必须检查）
1. **错别字检查**：逐字检查拼音错误、形近字错误
2. **标点符号**：逗号、句号、问号、感叹号使用规范
3. **基本格式**：段落开头空两格、标点占格规范

## 第二层级：语句通顺
1. **病句修正**：主谓宾搭配、词语搭配不当
2. **重复啰嗦**：删除不必要的重复词语
3. **句子完整**：检查成分残缺的句子

## 第三层级：内容结构
1. **字数达标**：是否符合年级要求
2. **段落分明**：是否有基本的分段意识
3. **内容相关**：是否围绕主题写作

# 评分标准（百分制）
## 基础规范（40分）
- 错别字：每个扣0.5分，最多扣10分
- 标点符号：每个错误扣0.5分，最多扣5分
- 书写格式：格式错误扣2-5分

## 语言表达（30分）
- 语句通顺：15分
- 词语准确：10分
- 表达生动：5分

## 内容结构（30分）
- 内容完整：10分
- 条理清晰：10分
- 主题突出：10分

# 输出要求
请严格按照以下JSON格式输出：
{
  "grade_level": "primary",
  "basic_stats": {
    "word_count": 字数,
    "paragraph_count": 段落数,
    "error_count": 错误数量
  },
  "score_breakdown": {
    "basic_norms": 基础规范得分,
    "language_expression": 语言表达得分,
    "content_structure": 内容结构得分,
    "total_score": 总分
  },
  "corrections": [
    {
      "type": "spelling|punctuation|grammar|logic|format",
      "position": "位置描述",
      "original_text": "原文",
      "suggested_text": "修改建议",
      "error_reason": "错误原因",
      "severity": "low|medium|high"
    }
  ],
  "encouraging_comments": "鼓励性总评",
  "improvement_suggestions": ["建议1", "建议2"],
  "writing_tips": ["技巧1", "技巧2"]
}`;

/**
 * 初中作文批改Prompt (7-9年级)
 */
const MIDDLE_PROMPT = `# 角色设定
你是严谨认真的初中语文教师，注重逻辑思维和表达能力培养。

# 批改重点层级
## 第一层级：语言准确性
1. **词语精准度**：近义词辨析、词语感情色彩
2. **句式多样性**：长短句结合、修辞手法运用
3. **语法规范**：复杂句式的语法正确性

## 第二层级：逻辑结构
1. **段落衔接**：过渡句、承上启下
2. **论证严密**：观点与论据的匹配度
3. **结构完整**：开头、主体、结尾的完整性

## 第三层级：思想深度
1. **立意新颖**：观点是否独特、有见地
2. **情感真实**：情感表达是否真挚自然
3. **文化内涵**：是否有一定的思想深度

# 评分标准（百分制）
## 内容立意（40分）
- 主题明确：10分
- 内容充实：15分
- 思想深刻：15分

## 语言表达（30分）
- 语言准确：10分
- 文采修辞：10分
- 表达流畅：10分

## 结构技巧（30分）
- 结构严谨：10分
- 层次清晰：10分
- 详略得当：10分

# 输出要求
请严格按照以下JSON格式输出：
{
  "grade_level": "middle",
  "advanced_analysis": {
    "thesis_strength": "论点力度评价",
    "argument_quality": "论证质量",
    "rhetorical_skills": "修辞手法运用"
  },
  "score_breakdown": {
    "content_meaning": 内容立意得分,
    "language_expression": 语言表达得分,
    "structure_skills": 结构技巧得分,
    "total_score": 总分
  },
  "detailed_corrections": [
    {
      "category": "language|logic|structure|content",
      "specific_issue": "具体问题描述",
      "original_excerpt": "原文片段",
      "suggested_revision": "修改建议",
      "rationale": "修改理由",
      "learning_point": "相关知识点"
    }
  ],
  "strength_analysis": "优点详细分析",
  "weakness_analysis": "待改进方面分析",
  "specific_suggestions": [
    {
      "aspect": "方面",
      "suggestion": "具体建议",
      "example": "示范例句"
    }
  ]
}`;

/**
 * 高中作文批改Prompt (10-12年级)
 */
const HIGH_PROMPT = `# 角色设定
你是资深高中语文教师，高考作文阅卷经验丰富，注重思辨性和文学性。

# 批改重点层级
## 第一层级：思想深度
1. **观点创新**：是否具有独到见解
2. **思辨能力**：分析问题的深度和广度
3. **价值取向**：价值观是否正确积极

## 第二层级：文学素养
1. **文采斐然**：语言的美感和感染力
2. **文化底蕴**：古今中外知识的融汇
3. **个性风格**：是否有个人写作风格

## 第三层级：技巧娴熟
1. **结构精巧**：文章结构的艺术性
2. **手法纯熟**：各种写作手法的运用
3. **材料新颖**：素材的独特性和时代性

# 高考评分标准（60分制转换为百分制）
## 基础等级（40分）
- 内容：20分（切题、充实、深刻）
- 表达：20分（规范、流畅、生动）

## 发展等级（20分）
- 特征：10分（深刻、丰富、有文采）
- 创新：10分（见解新颖、材料新鲜）

# 输出要求
请严格按照以下JSON格式输出：
{
  "grade_level": "high",
  "college_entrance_standard": {
    "basic_level_score": 基础等级得分,
    "development_level_score": 发展等级得分,
    "total_score": 总分（60分制）,
    "percentage_score": 百分制得分
  },
  "depth_analysis": {
    "theoretical_depth": "思想深度评价",
    "cultural_literacy": "文化素养体现",
    "critical_thinking": "思辨能力分析"
  },
  "artistic_evaluation": {
    "language_artistry": "语言艺术性",
    "structural_ingenuity": "结构巧妙性",
    "stylistic_features": "风格特征"
  },
  "corrections": [
    {
      "type": "language|logic|structure|content",
      "position": "位置",
      "original_text": "原文",
      "suggested_text": "修改建议",
      "improvement_reason": "提升理由"
    }
  ],
  "college_prep_suggestions": [
    {
      "exam_skill": "应试技巧建议",
      "knowledge_gap": "知识漏洞指出",
      "improvement_plan": "提升方案"
    }
  ],
  "model_essay_comparison": "与范文对比分析"
}`;

/**
 * OCR预处理Prompt
 */
const OCR_PREPROCESS_PROMPT = `# 角色设定
你是专业的文字识别后处理专家，负责清理和修正OCR识别结果。

# 处理流程
1. **文字校正**：纠正识别错误的字符
2. **格式还原**：恢复原始作文的段落结构
3. **符号标准化**：统一中文标点符号
4. **异常检测**：标记识别质量较差的区域

# 处理规则
- 保留原始段落空行和缩进
- 将英文标点转换为中文标点
- 纠正常见OCR错误
- 标记[识别存疑]的文本段

# 输出格式
请严格按照以下JSON格式输出：
{
  "cleaned_text": "清理后的文本",
  "confidence_level": 置信度(0-1),
  "questionable_sections": [
    {
      "position": "第X段",
      "original": "原始识别",
      "corrected": "修正结果",
      "confidence": 置信度
    }
  ],
  "formatting_preserved": true
}`;

/**
 * 错误分类体系Prompt
 */
const ERROR_CLASSIFICATION_PROMPT = `# 错误分类标准

## A类：字词错误
A1. 错别字（同音字、形近字）
A2. 词语误用（近义词混淆）
A3. 生造词语

## B类：语法错误  
B1. 成分残缺（缺主语、宾语）
B2. 搭配不当（主谓、动宾）
B3. 语序混乱
B4. 结构混乱

## C类：逻辑错误
C1. 前后矛盾
C2. 因果不当
C3. 概念混淆

## D类：表达问题
D1. 重复啰嗦
D2. 表达不清
D3. 衔接生硬

## E类：内容问题
E1. 偏离主题
E2. 内容空洞
E3. 观点错误

# 严重程度分级
- 低级错误：影响理解的基础性错误
- 中级错误：影响表达效果的错误  
- 高级错误：影响文章质量的深层问题`;

// Prompt缓存
const promptCache = new Map();
const MAX_CACHE_SIZE = 100;

/**
 * LRU缓存实现
 * @param {string} key - 缓存键
 * @param {*} value - 缓存值
 */
function setCache(key, value) {
  if (promptCache.size >= MAX_CACHE_SIZE) {
    // 删除最早的缓存项
    const firstKey = promptCache.keys().next().value;
    promptCache.delete(firstKey);
  }
  promptCache.set(key, value);
}

/**
 * 从缓存获取
 * @param {string} key - 缓存键
 * @returns {*} 缓存值或undefined
 */
function getCache(key) {
  if (promptCache.has(key)) {
    // LRU: 移到末尾
    const value = promptCache.get(key);
    promptCache.delete(key);
    promptCache.set(key, value);
    return value;
  }
  return undefined;
}

/**
 * 清空缓存
 */
export function clearCache() {
  promptCache.clear();
}

/**
 * 获取主控Prompt
 * @returns {string} 主控Prompt
 */
export function getMasterPrompt() {
  return MASTER_PROMPT;
}

/**
 * 获取学段特定Prompt
 * @param {string} gradeLevel - 学段 (primary/middle/high)
 * @returns {string} 学段特定Prompt
 * @throws {Error} 如果学段无效
 */
export function getGradeLevelPrompt(gradeLevel) {
  if (!gradeLevel || typeof gradeLevel !== 'string') {
    throw new Error('学段参数必须是非空字符串');
  }

  const normalizedGrade = gradeLevel.toLowerCase().trim();

  const promptMap = {
    primary: PRIMARY_PROMPT,
    middle: MIDDLE_PROMPT,
    high: HIGH_PROMPT,
  };

  if (!promptMap[normalizedGrade]) {
    throw new Error(`无效的学段: ${gradeLevel}，必须是primary、middle或high之一`);
  }

  return promptMap[normalizedGrade];
}

/**
 * 获取OCR预处理Prompt
 * @returns {string} OCR预处理Prompt
 */
export function getOcrPreprocessPrompt() {
  return OCR_PREPROCESS_PROMPT;
}

/**
 * 获取错误分类Prompt
 * @returns {string} 错误分类Prompt
 */
export function getErrorClassificationPrompt() {
  return ERROR_CLASSIFICATION_PROMPT;
}

/**
 * 组装完整的批改Prompt
 * @param {string} essayContent - 作文内容
 * @param {string} gradeLevel - 学段 (primary/middle/high)
 * @param {Object} options - 可选参数
 * @param {string} options.title - 作文标题
 * @param {string} options.additionalRequirements - 附加要求
 * @returns {Object} { systemPrompt, userPrompt }
 * @throws {Error} 如果参数无效
 */
export function assembleFullPrompt(essayContent, gradeLevel, options = {}) {
  // 参数验证
  if (!essayContent || typeof essayContent !== 'string' || essayContent.trim().length === 0) {
    throw new Error('作文内容不能为空');
  }

  if (!gradeLevel || typeof gradeLevel !== 'string') {
    throw new Error('学段参数必须是非空字符串');
  }

  // 生成缓存键
  const cacheKey = `${gradeLevel}:${essayContent.length}:${options.title || ''}:${
    options.additionalRequirements || ''
  }`;

  // 检查缓存
  const cached = getCache(cacheKey);
  if (cached) {
    return cached;
  }

  // 性能计时开始
  const startTime = performance.now();

  // 获取Prompt模板
  const masterPrompt = getMasterPrompt();
  const gradeLevelPrompt = getGradeLevelPrompt(gradeLevel);

  // 构建系统Prompt
  const systemPrompt = `${masterPrompt}

${gradeLevelPrompt}`;

  // 构建用户Prompt
  const gradeName =
    gradeLevel === 'primary' ? '小学' : gradeLevel === 'middle' ? '初中' : '高中';

  const userPrompt = `请批改以下作文：

【作文信息】
- 学生学段：${gradeName}
- 作文标题：${options.title || '无标题'}
- 作文字数：${essayContent.length}字
- 批改时间：${new Date().toISOString()}

【作文内容】
${essayContent}

${options.additionalRequirements ? `【附加要求】\n${options.additionalRequirements}\n` : ''}
请严格按照指定的JSON格式输出批改结果，不要包含任何其他文字。`;

  const result = {
    systemPrompt,
    userPrompt,
  };

  // 性能计时结束
  const endTime = performance.now();
  const duration = endTime - startTime;

  // 记录性能（如果超过10ms则警告）
  if (duration > 10) {
    console.warn(`Prompt组装耗时 ${duration.toFixed(2)}ms，超过10ms目标`);
  }

  // 缓存结果
  setCache(cacheKey, result);

  return result;
}

/**
 * 获取所有可用的学段列表
 * @returns {Array<string>} 学段列表
 */
export function getAvailableGradeLevels() {
  return ['primary', 'middle', 'high'];
}

/**
 * 验证学段是否有效
 * @param {string} gradeLevel - 学段
 * @returns {boolean} 是否有效
 */
export function isValidGradeLevel(gradeLevel) {
  return getAvailableGradeLevels().includes(gradeLevel);
}

/**
 * 获取缓存统计信息
 * @returns {Object} 缓存统计
 */
export function getCacheStats() {
  return {
    size: promptCache.size,
    maxSize: MAX_CACHE_SIZE,
    keys: Array.from(promptCache.keys()),
  };
}

export default {
  getMasterPrompt,
  getGradeLevelPrompt,
  getOcrPreprocessPrompt,
  getErrorClassificationPrompt,
  assembleFullPrompt,
  getAvailableGradeLevels,
  isValidGradeLevel,
  clearCache,
  getCacheStats,
};

